﻿#include "OperUndoRedo.h"

// Qt
#include <QDialog>

// App
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Kernel/FITKAppFramework/FITKComponents.h"

// Global data
#include "FITK_Kernel/FITKCore/FITKGUIRepo.h"

// Geometry
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeoInterfaceFactory.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelImport.h"

// Operator
#include "OperatorsInterface/GraphEventOperator.h"

namespace ModelOper
{
    // 撤销。
    //@{
    bool OperUndo::execGUI()
    {
        // 撤销无需界面操作。
        return true;
    }

    bool OperUndo::execProfession()
    {
        // 判断是否为草绘模式。
        Interface::FITKGeoCommandList* cmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
        if (!cmdList)
        {
            return false;
        }

        // 判断是否为建模窗口弹出状态。
        QList<QDialog*> dlgs = FITKGUIREPO->getGUIObjects<QDialog>();
        for (QDialog* dlg : dlgs)
        {
            if (!dlg)
            {
                continue;
            }

            if (dlg->isVisible())
            {
                return false;
            }
        }

        // 执行撤销。
        Interface::FITKAbsGeoCommand* cmd = cmdList->getDataByIndex(cmdList->getDataCount() - 1);
        if (!cmd)
        {
            return false;
        }

        bool flag = cmdList->undo();
        if (!flag)
        {
            return false;
        }

        // 刷新被操作的对象及上游对象。
        EventOper::GraphEventOperator* operGraph = FITKOPERREPO->getOperatorT<EventOper::GraphEventOperator>("GraphPreprocess");
        if (operGraph)
        {
            operGraph->updateGraphRecursively(cmd->getDataObjectID(), -1, false);
        }

        // 刷新模型树。
        if (m_MainWindow)
        {
            m_MainWindow->updateGeometryTree();
        }

        return true;
    }
    //@}

    // 重做。
    //@{
    bool OperRedo::execGUI()
    {
        // 重做无需界面操作。
        return true;
    }

    bool OperRedo::execProfession()
    {
        // 判断是否为草绘模式。
        Interface::FITKGeoCommandList* cmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
        if (!cmdList)
        {
            return false;
        }

        // 判断是否为建模窗口弹出状态。
        QList<QDialog*> dlgs = FITKGUIREPO->getGUIObjects<QDialog>();
        for (QDialog* dlg : dlgs)
        {
            if (!dlg)
            {
                continue;
            }

            if (dlg->isVisible())
            {
                return false;
            }
        }

        // 执行重做。
        bool flag = cmdList->redo();
        if (!flag)
        {
            return false;
        }

        Interface::FITKAbsGeoCommand* cmd = cmdList->getDataByIndex(cmdList->getDataCount() - 1);
        if (!cmd)
        {
            return false;
        }

        // 刷新被操作的对象及上游对象。
        EventOper::GraphEventOperator* operGraph = FITKOPERREPO->getOperatorT<EventOper::GraphEventOperator>("GraphPreprocess");
        if (operGraph)
        {
            operGraph->updateGraphRecursively(cmd->getDataObjectID(), -1, false);
        }

        // 刷新模型树。
        if (m_MainWindow)
        {
            m_MainWindow->updateGeometryTree();
        }

        return true;
    }
    //@}
} // namespace ModelOper
